package com.hilihili.mapper;

import com.hilihili.domain.dto.PageDTO;
import com.hilihili.domain.entity.*;
import com.hilihili.domain.vo.VideoIndexVO;
import com.hilihili.domain.vo.ViewCounts;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 视频Mapper接口
 *
 * @author xhc
 * @date 2023-11-15
 */
@Mapper
public interface VideoMapper
{
    public int updateLikesAdd(Long id);
    public int updateLikesSubtract(Long id);
    public int updateCoinsSubtract(@Param("id") Long id, @Param("coins")Long coins);

    public int updateStarsSubtract(@Param("id") Long id, @Param("stars")Long stars);

//    ----------------------------
    /**
     * 查询视频
     *
     * @param id 视频主键
     * @return 视频
     */
    public Video selectVideoById(Long id);
    public VideoIndexVO selectVideoSimpleInfoById(Long id);

    public Video selectPublishedVideoById(Long id);
    /**
     * 查询视频列表
     *
     * @param video 视频
     * @return 视频集合
     */
    public List<VideoIndexVO> selectVideoSimpleInfoList(PageDTO pageDTO);

    public List<String> selectVideoIdList(PageDTO pageDTO);

    /**
     * 新增视频
     *
     * @param video 视频
     * @return 结果
     */
    public int insertVideo(Video video);

    /**
     * 修改视频
     *
     * @param video 视频
     * @return 结果
     */
    public int updateVideo(Video video);

    /**
     * 删除视频
     *
     * @param id 视频主键
     * @return 结果
     */
    public int deleteVideoById(Long id);

    /**
     * 批量删除视频
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteVideoByIds(Long[] ids);

    /**
     * 获取所有video
     * @return {@link List}<{@link Video}>
     */
    List<Video> selectAll();

    /**
     * 批量更新视频播放量
     * @param viewCounts
     */
    void batchUpdateVideo(@Param("viewCounts") List<ViewCounts> viewCounts);

    /**
     * 获取用户发布最新的视频
     * @param userId
     * @return {@link Video}
     */
    Video getLatestVideo(String videoId);

    /**
     * 查找视频合集下的视频
     * @param id
     * @return {@link List}<{@link CollectionVideoItem}>
     */
    List<CollectionVideoItem> selectCollectionVideoItemById(Long id);

    /**
     * 查找剧集视频下的所有视频
     * @param id
     * @return {@link List}<{@link EpisodeVideoItem}>
     */
    List<EpisodeVideoItem> selectEpisodeVideoItemById(Long id);


    /**
     * 获取主题视频的caption
     * @param id
     * @return {@link List}<{@link String}>
     */
    List<String> selectThemeVideoCaptionId(Long id);

    /**
     * 获取caption下的视频
     * @param captionId
     * @return {@link ArrayList}<{@link ThemeVideoItem}>
     */
    ArrayList<ThemeVideoItem> selectThemeVideoItemByCaptionId(Long captionId);

    /**
     * 当video_id != head_id时查找合集视频
     * @param id
     * @return {@link List}<{@link CollectionVideoItem}>
     */
    List<CollectionVideoItem> selectCollectionVideoItemByHeadId(Long id);

    /**当video_id != head_id时查找剧集视频
     * @param id
     * @return {@link List}<{@link EpisodeVideoItem}>
     */
    List<EpisodeVideoItem> selectEpisodeVideoItemByHeadId(Long id);

    /**当video_id != head_id时查找主题视频CaptionId
     * @param id
     * @return {@link List}<{@link String}>
     */
    List<String> selectThemeVideoCaptionIdByHeadId(Long id);


    /**
     * 获取视频所在的位置
     * @param id
     * @return {@link Integer}
     */
    Integer getCollectiomVideoIndex(Long id);

    /**
     * 获取视频所在的位置
     * @param id
     * @return {@link Integer}
     */
    Integer getEpisodeVideoIndex(Long id);

    /**
     *保存视频主题
     * @param videoId
     * @param topicId 主题
     */
    void insertVideoTopic(@Param("videoId") String videoId,@Param("topicId") Integer topicId);

    /**
     * 保存视频相关的标签
     * @param videoId
     * @param tag 标签
     */
    void insertVideoTag(@Param("videoId")String videoId,@Param("tag") List<Tag> tag);

    /**
     * 保存视频定时发布时间
     * @param videoId
     * @param publishTime
     */
    void insertPublishList(@Param("videoId")String videoId,@Param("publishTime") String publishTime);

    /**
     * 上传视频
     *
     * @param video
     * @return int
     */
    int uploadVideo(Video video);

    /**
     * 获取 视频发布时间 小于 当前时间 的视频
     *
     * @param now 当前时间
     * @return {@link List}<{@link String}>
     */
    List<String> selectVideoByPublishTime(LocalDateTime now);


    /**
     * 批量发布视频
     * @param videoIds
     */
    void batchPublishVideo(@Param("videoIds") List<String> videoIds);

    /**
     *
     * @param md5
     * @return {@link VideoMD5}
     */
    VideoMD5 getVideoByMD5(String md5);

    void insertVideoMD5(@Param("videoPath") String videoPath,@Param("md5") String md5,@Param("videoId")String videoId);

    void deleteVideoMD5(Long videoId);

    /**
     *
     * @param filePath 文件地址
     */
    void publishVideoByLink(String filePath);
}
